# * coding:utf-8 *     # utf-8 방식 코딩을 이용 
import time            # 메일전송시 sleep함수를 이용하게 하기 위함
import serial          # 시리얼 포트 이용
import smtplib         # Smtp 메일 서버 이용
from Tkinter import *  # tkinter를 사용하기위해 import
import Tkinter

SUBJECT = u'도난방지시스템!!'                                # 메일제목, 한글 전송을 위해 유니코드로 바꿔서 전송
TEXT = u'당신의  물건이  도난되었습니다!!, 자리로 돌아가서  확인하세요!!'  # 메일 내용, 한글 전송을 위해 유니코드로 바꿔서 전송
ser = serial.Serial('COM6', 115200)                      # 시리얼 포트 번호를 지정해준다. 아두이노 시리얼 모니터 

def send_email():                                        # 메세지 전송 클래스
    global entries, entries2                             # 아이디와 비밀번호 입력을 위한 엔트리
    key = entries['Mail ID'].get()                       # 첫번째 키값을 메일 아이디로 지정
    key2 = entries2['Password'].get()                    # 두번째 키값을 메일 암호로 지정
    TO = key + '@gmail.com'                              # 보내는 메일 계정
    GMAIL_USER = key + '@gmail.com'                      # 받는 사람의 메일 계정
    GMAIL_PASS = key2                                    # 받는 사람의  비밀번호
    print("Sending Email")                               # 메일을 보낼 조건을 만족할때 콘솔창에 Sending Email 이라는 문구 출력
    smtpserver = smtplib.SMTP("smtp.gmail.com",587)      # smtp서버를 Gmail smtp서버로 지정
    smtpserver.ehlo()                                    # Gmail smtp서버에 연결 
    smtpserver.starttls()                                # TLS모드에서 smtp를 연결한다. 이때부터 모든 smtp의 명령어는 암호화 된다.
    smtpserver.ehlo
    smtpserver.login(GMAIL_USER, GMAIL_PASS)             # 입력된 아이디와 비밀번호로 Gmail에 로그인 한다.
    header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER   # 콘솔창 출력문
    header = header + '\n' + 'Subject:' + SUBJECT.encode('utf-8') + '\n'    # 콘솔창 출력문
    print(header)                                                           # 위에서 정의한 출력문을 출력 
    msg = header + '\n' + TEXT.encode('utf-8') + ' \n\n'                    # 출력문을 메일 메세지로 바꾼다(한글 전송도 가능하도록 UTF8 방식을 이용)
    smtpserver.sendmail(GMAIL_USER, TO, msg)                                # 메일 전송
    smtpserver.close()                                                      # 메일 서버를 닫는다.

def aduin():                             # 아두이노 시리얼 모니터의 내용을 받아 오는 클래스
    while True: 
        message = ser.readline()         # 시리얼 모니터의 내용을 한줄씩 받아온다.
        print(message)                   # 콘솔창에 받은 메세지를 출력 
        if message[0] == 'M' :           # 메세지의 내용중 'M'으로 시작하는 메세지가 날라오면
            send_email()                 # send_email클래스를 실행한다
        time.sleep(0.5)                  # send_email클래스 수행후 딜레이를 준다.

top = Tkinter.Tk()                       # tkinter를 이용해서 위젯을 만든다.
top.title('도난방지 시스템')                  # 위젯의 이름을 설정한다 

form = Frame(top)                        # 프레임을 설정해준다
form.pack()                              # 위에서 지정한 프레임의 위치를 지정해준다 
 
ent = Entry(form)                        # ent로 정의된 엔트리를 지정
ent2 = Entry(form)                       # ent2러 정의된  엔트리를 지정
ent.grid(row=10, column=1)               # ent를 지정된 위치에 위치하게 한다
ent2.grid(row=20, column=1)              # ent2를 지정된 위치에 위치하게 한다

entries = {}                             # entries를 정의
entries['Mail ID'] = ent                 # mail ID를  ent로 지정

entries2 = {}                            # entries2를 정의
entries2['Password'] = ent2              # password를 ent2로 지정

lab = Label(form, text='mail ID')        # mail ID를 lab이라는 이름의 라벨로 지정
lab.grid(row=10, column=0)               # lab을 지정된 위치에 위치하게 한다
lab2 = Label(form, text='Password')      # Password 를 lab2이라는 이름의 라벨로 지정
lab2.grid(row=20, column=0)              # lab2을 지정된 위치에 위치하게 한다
lab3 = Label(form, text=u'@gmail.com')   # @gmail.com이라는 문구를 lab3이라는 이름의 라벨로 지정 
lab3.grid(row=10, column=2)              # lab3을 지정된 위치에 위치하게 한다
B = Button(top, text="시작", command=aduin)    # 아두이노 시리얼 모니터의 내용을 받는 클래스를 버튼으로 지정해준다
B.pack(side=RIGHT)                       # 위의 버튼을 오른쪽으로 위치하게 한다

top.mainloop()                           # 위젯을 실행한다

